/*+++++++++++++++++++++++++++++++++++++++++
  +                                       +
  + Autore: Davide Gugliotta              +
  + E-mail: dvd.gugliotta@gmail.com       +
  +                                       +
  + FILE: ../tests/scanner_test_tcp.c     +
  +                                       +
  + Test per il tcp scan                  +
  +                                       +
  +++++++++++++++++++++++++++++++++++++++++*/
  
  #include "../modules/scanner.h"
  
  /* Header per la fcntl() */
  #include <unistd.h>
  #include <fcntl.h>

  int main(int argc,char *argv[]){
     
    /* memorizza il responso della scansione */
    unsigned char responso;  

    /* struttura per settare il timeout */
    struct timeval tm;
 
  /*+++++++++++++++++++++++++++++++++++++++++++++++++++++                                         
    +                                                   +
    + pkt_scan è la struttura che deve essere riempita  +
    + prima di avviare la procedura di scan.            +                                         +
    +                                                   +
    +++++++++++++++++++++++++++++++++++++++++++++++++++++*/ 
  
    struct pkt_scan sp;                                          
  
    if(argc < 3){
    
      fprintf(stdout, "host o porta destinazione mancante..\n");
      exit(EXIT_FAILURE);
  
    }
  
    if(atoi(argv[2]) > 65535){
     
      fprintf(stdout, "ricontrollare porta di destinazione..\n");
      exit(EXIT_FAILURE);

    }

    memset(&sp.d_ip, 0, sizeof(struct sockaddr_in)); 
    
    sp.d_host = gethostbyname(argv[1]);
    if(sp.d_host == NULL){
    
      fprintf(stderr,"gethostbyname() : %s\n",strerror(errno));
      exit(EXIT_FAILURE);
  
    }

    /* creazione socket SOCK_STREAM tcp */
    sp.socket = socket(AF_INET, SOCK_STREAM, 0);
    if(sp.socket == -1){
    
      fprintf(stderr, "socket() : %s\n", strerror(errno));
      exit(EXIT_FAILURE);

    }
  
    /* setto la socket come non bloccante O_NONBLOCK */     
    if(fcntl(sp.socket, F_SETFL, O_NONBLOCK) < 0){

      fprintf(stderr, "fcntl() : %s\n", strerror(errno));
      exit(EXIT_FAILURE);
   
    }
    
    sp.d_ip.sin_family = AF_INET;
    sp.d_ip.sin_port = htons(atoi(argv[2]));
    sp.d_ip.sin_addr = *((struct in_addr *)sp.d_host->h_addr); 

    if((responso = tcpscan(&sp)) == 0)
      fprintf(stdout, "%s:%hu stato [CHIUSA]\n", inet_ntoa(sp.d_ip.sin_addr), ntohs(sp.d_ip.sin_port));
    else if(responso == 1)
      fprintf(stdout, "%s:%hu stato [APERTA]\n", inet_ntoa(sp.d_ip.sin_addr), ntohs(sp.d_ip.sin_port));
    else
      fprintf(stdout, "%s:%hu stato [FILTRATA]\n", inet_ntoa(sp.d_ip.sin_addr), ntohs(sp.d_ip.sin_port));    
  
  }
